在本系列文中,所有的程式碼都可以在 should-i-use-fp-ts 找到,今日的範例放在 src/day-21
並且有測試可以讓大家練習。
今天我們使用 Either
來包裝 JSON.stringify
,跟昨天的 JSON.parse
一樣,正常使用的時候,這些函式的型別並不會告知使用者會有 exception
的可能性,這樣可能導致 runtime
時出現無法預期的錯誤。
// Type: (value: any, replacer?: (string | number)[] | null | undefined, space?: string | number | undefined) => string | unknown
const normalStringify = (...args: Parameters<typeof JSON.stringify>) => {
try {
return JSON.stringify(...args);
} catch (error) {
return error;
}
};
跟昨天的 normalParse 一樣,輸出型別只會有 string | unknown
,這邊使用 Either
來改善他的型別,讓使用函式的人可以了解使用的風險。
// Type: (value: any, replacer?: (string | number)[] | null | undefined, space?: string | number | undefined) => E.Right<string> | E.Left<unknown>
const stringify = (...args: Parameters<typeof JSON.stringify>) => {
try {
const stringified = JSON.stringify(...args);
if (typeof stringified !== 'string') {
throw new Error('Unsupported structure');
}
return E.right(stringified);
} catch (error) {
return E.left(error);
}
};
每次使用 stringify
函式的時候,都會需要考慮兩種情況(left
and right
),這樣可以有效降低無法預期的風險。
今天的主題在 should-i-use-fp-ts 在 src/day-21
並且有測試可以讓大家練習。